package dbhelp

import (
	"errors"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

var DB *gorm.DB  //主数据库链接单例
var DB2 *gorm.DB //副数据库链接单例

func Init(connectStr string) (err error) {
	DB, err = initDB(connectStr)
	return nil
}

func Init2(connectStr string) (err error) {
	DB2, err = initDB(connectStr)
	return
}

func initDB(connectStr string) (db *gorm.DB, err error) {

	if connectStr == "" {
		return nil, errors.New("connect str is nil")
	}

	gCfg := &gorm.Config{
		CreateBatchSize: 100000,
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "",
			SingularTable: true,
		},
		//Logger: logger.GL,
	}

	db, err = gorm.Open(mysql.Open(connectStr), gCfg)
	if err != nil {
		return nil, err
	}

	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}

	// 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(1000)
	// 设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(2000)
	// 设置了连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(time.Second * 5)
	sqlDB.SetConnMaxIdleTime(time.Second * 5)

	return db, nil
}

// MigrateTables 自动建表
func MigrateTables(dst ...interface{}) {
	db := DB.Set("gorm:table_options", "ENGINE=InnoDB")
	db = db.Set("gorm:table_options", "CHARSET=utf8")
	_ = db.AutoMigrate(dst...)
}

func New() *gorm.DB {
	return DB.Session(&gorm.Session{})
}
